/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package descricaoProduto;

import atualizaestoque.RepositorioAtualizaEstoque;
import descricaoProduto.DescricaoProdutoNaoCadastradoException;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author Alberto
 */
public class RepositorioDescricaoProduto implements IRepositorioDescricaoProduto {

    /**
     * Contrutor da classe
     * 
     * @throws ErroAcessoRepositorioException
     */
    public RepositorioDescricaoProduto() throws ErroAcessoRepositorioException {
        // this.objSession = HibernateUtil.getCurrentSession();
        // this.objTransaction = this.objSession.beginTransaction();
    }
    /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

    /**
     * Metodo que ira cadastrar o DescricaoProduto
     *
     * @param DescricaoProduto objDescricaoProduto
     * @return void
     */
    public void cadastrarAtualizar(DescricaoProduto objDescricaoProduto) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;
        try {
            
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
           
            s.saveOrUpdate(objDescricaoProduto.getControleFalta());
            
            s.saveOrUpdate(objDescricaoProduto);
            
            // Comtando tudo caso der certo
            t.commit();
           
        } catch (Exception e) {
            t.rollback();
            //s.close();
            e.printStackTrace();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        
    }

    /**
     * Metodo que ira produrar o DescricaoProduto
     *
     * @param int idDescricaoProduto
     * @return void
     */
    public DescricaoProduto procurar(int idDescricaoProduto) throws DescricaoProdutoNaoCadastradoException, ErroAcessoRepositorioException {
        DescricaoProduto objDescricaoProduto = null;

        if (this.existe(idDescricaoProduto)) {
            Session s = null;
            Transaction t = null;
            try {

                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                // Salvando o produto no banco
                objDescricaoProduto = (DescricaoProduto) s.get(DescricaoProduto.class, idDescricaoProduto);
                // Comtando tudo caso der certo
                t.commit();
            } catch (Exception e) {
                t.rollback();
                
                throw new DescricaoProdutoNaoCadastradoException();
            }
        } else {
            throw new DescricaoProdutoNaoCadastradoException("DescriÇão Produto Não Cadastrado");
        }

        return objDescricaoProduto;
    }
    
    /**
     * Metodo que ira listar os Categorias
     *
     * @return Collection
     */
    public List<DescricaoProduto> procurarPorDescricaoPorSubCategoria(String descricaoProduto, int idSubCategoria) throws Exception, ErroAcessoRepositorioException {
        List<DescricaoProduto> listDescricaoProduto = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // criando o sql
            String sql = "from DescricaoProduto  WHERE id_descricao_produto IS NOT NULL ";
            if(descricaoProduto.trim().length() > 0){
                sql += " AND decsricao_produto LIKE :decsricao_produto ";
            }
            if(idSubCategoria > 0){
                sql += " AND id_sub_categoria = :id_sub_categoria ";
            }
            // Criando a query
            Query q = s.createQuery(sql);
            if(descricaoProduto.trim().length() > 0){
                q.setParameter("decsricao_produto", "%" + descricaoProduto + "%");
            }
            if(idSubCategoria > 0){
                q.setParameter("id_sub_categoria", idSubCategoria);
            }
            
            // Listando as categorias
            listDescricaoProduto = q.list();
            
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        return listDescricaoProduto;
    }
    
    /**
     * Metodo que ira verificar a existência do DescricaoProduto
     *
     * @param int idDescricaoProduto
     * @return void
     */
    public boolean existe(int idDescricaoProduto) throws ErroAcessoRepositorioException {
        DescricaoProduto objDescricaoProduto = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            // Salvando o produto no banco
            objDescricaoProduto = (DescricaoProduto) s.get(DescricaoProduto.class, idDescricaoProduto);
            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();

        }
        return (objDescricaoProduto != null);
    }

    /**
     * Metodo que ira listar os DescricaoProdutos
     *
     * @return Collection
     */
    public List<DescricaoProduto> listar(String strComplemento) throws Exception, ErroAcessoRepositorioException {
        List<DescricaoProduto> listDescricaoProduto = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();


            Query q = s.createQuery("from DescricaoProduto  WHERE id_descricao_produto IS NOT NULL " + strComplemento);

            listDescricaoProduto = q.list();

            t.commit();

        } catch (Exception e) {
            t.rollback();
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }

        return listDescricaoProduto;
    }
    
    /**
     * Metodo que ira listar os DescricaoProdutos QUE ESTEJAM necessitando ser repostos
     *
     * @return Collection
     */
    public List<DescricaoProduto> listarDescricaoProdutoBaixoEstoque(String descricaoProduto, int idSubCategoria) throws Exception, ErroAcessoRepositorioException {
        List<DescricaoProduto> listDescricaoProduto = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            String sql = "SELECT * FROM descricao_produto dp inner join controle_falta cf on dp.id_controle_falta = cf.id_controle_falta WHERE cf.quantidade_atual <= cf.quantidade_minima and repor = TRUE ";
            if(descricaoProduto.trim().length() > 0){
                sql += " AND decsricao_produto LIKE :decsricao_produto ";
            }
            if(idSubCategoria > 0){
                sql += " AND id_sub_categoria = :id_sub_categoria ";
            }
            
            // Criando a query
            Query q = s.createSQLQuery(sql).addEntity(DescricaoProduto.class);
            
            if(descricaoProduto.trim().length() > 0){
                q.setParameter("decsricao_produto", "%" + descricaoProduto + "%");
            }
            if(idSubCategoria > 0){
                q.setParameter("id_sub_categoria", idSubCategoria);
            }

            listDescricaoProduto = q.list();

            t.commit();

        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }

        return listDescricaoProduto;
    }
    
    /**
     * Metodo que ira listar os DescricaoProdutos
     *
     * @return Collection
     */
    public List<DescricaoProduto> listarAtivos() throws Exception, ErroAcessoRepositorioException {
        String descricao  = " AND status_drescicao_produto = true ORDER  BY id_descricao_produto";

        return this.listar(descricao);
    }

    /**
     * Método que ira remover o DescricaoProduto do banco
     *
     * @param idDescricaoProduto
     */
    public void remover(int idDescricaoProduto) throws DescricaoProdutoNaoCadastradoException, ErroAcessoRepositorioException {
        DescricaoProduto objDescricaoProduto = null;
        if (this.existe(idDescricaoProduto)) {
            Session s = null;
            Transaction t = null;
            try {

                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();


                // Recupero o meu produto
                objDescricaoProduto = (DescricaoProduto) s.get(DescricaoProduto.class, idDescricaoProduto);

                // Seto seu id como excluido
                objDescricaoProduto.setStatusDrescicaoProduto(false);
                
                t.commit();
                
                // Atualizo ele pra excluido
                this.cadastrarAtualizar(objDescricaoProduto);

            } catch (Exception e) {
                t.rollback();
                //  this.objSession.close();
                throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
            }
            // this.objSession.close();

        } else {
            throw new DescricaoProdutoNaoCadastradoException();
        }
    }
}
